<?php
/**
 * 功能：
 * 说明：
 * 创建日期：
 * 更新日期：
 * 作者：Mirze
 * 补充说明： 
 * 
 */
class DB
{
	const IS_F_DB = false; // 是否框架应用DB：true/false
	const DBO_REG_NAME = 'dbo_default'; //DB链接对象表登记名称

	//const KEY_MASTER = 'master'; //主数据库
	//const KEY_SLAVER = 'slaver'; //从数据库
	//protected $masterDB = null;
	//protected $slaverDB = null;

	//数据库连接句柄
	protected $_conn;

	/**
	 * (功能描述)  将字符串形式的 DSN 转换为数组
     *
     * @code php
     * $string = 'mysql://root:mypass@localhost/test';
     * $dsn = DB::parseDSN($string);
     * 输出：
     * + array(
     * +     driver:   mysql
     * +     host:     localhost
     * +     login:    root
     * +     password: mypass
     * +     database: test
     * +     port:
     * + )
     * @endcode
     *
     * @param string $dsn 要分析的 DSN 字符串
     * @return array 分析后的数据库连接信息
     */
	static function parseDSN($dsn)
    {
		$dsn = str_replace('@/', '@localhost/', $dsn);
		$parse = parse_url($dsn);
		if (empty($parse['scheme'])) {
			return false;
		}

		$dsn = array();
		$dsn['host']  = isset($parse['host']) ? $parse['host'] : 'localhost';
		$dsn['port'] = isset($parse['port']) ? $parse['port'] : '';
		$dsn['login'] = isset($parse['user']) ? $parse['user'] : '';
		$dsn['password'] = isset($parse['pass']) ? $parse['pass'] : '';
		$dsn['driver'] = isset($parse['scheme']) ? strtolower($parse['scheme']) : '';
		$dsn['database'] = isset($parse['path']) ? substr($parse['path'], 1) : '';

		return $dsn;
    }	

	/**
	 * (功能描述) 获取一个数据库链接对象
	 *
	 * @param 
	 * @return
	 */
	static function getConn($db_config=null)
	{
		if(self::IS_F_DB === true) {
			if(empty($db_config) && F::isRegistered(self::DBO_REG_NAME)) {
				return F::registry(self::DBO_REG_NAME);
			}
		}		

		if(!is_array($db_config)) {
			$db_config = self::parseDSN($db_config);
		}

		if(empty($db_config)) {
			//trigger_error('invalid dsn');
			exit('invalid dsn');
		}

		$dbtype = $db_config['driver'];
        $objid = "dbo_{$dbtype}_" .  md5(serialize($db_config));

		if(self::IS_F_DB === true) {
			if (F::isRegistered($objid)) {
				return F::registry($objid);
			}
		}

		$class_path = 'adapter/' . $dbtype . '.php';
		$class_name = 'Adapter_' . ucfirst($dbtype);
		
		include($class_path);

		$dbo = new $class_name($db_config, $objid);
		
		if(self::IS_F_DB === true) {
			F::register($dbo, $objid);
			if (empty($db_config)) {
				F::register($dbo, 'dbo_default');
			}
		}

        return $dbo;
    }

	function getReader() {
		return self::getConn;
	}

	function getWriter() {
		return self::getConn;
	}

}